home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / linux / atari / source / source.lzh / atari-linux-0.01pl3 / fs / minix / dir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-05  |  2.6 KB  |  105 lines

  1. /*
  2.  *  linux/fs/minix/dir.c
  3.  *
  4.  *  Copyright (C) 1991, 1992 Linus Torvalds
  5.  *
  6.  *  minix directory handling functions
  7.  *
  8.  * This file is subject to the terms and conditions of the GNU General Public
  9.  * License.  See the file README.legal in the main directory of this archive
  10.  * for more details.
  11.  */
  12.  
  13. #include <asm/segment.h>
  14.  
  15. #include <linux/errno.h>
  16. #include <linux/fs.h>
  17. #include <linux/minix_fs.h>
  18. #include <linux/stat.h>
  19.  
  20. static int minix_dir_read(struct inode * inode, struct file * filp, char * buf, int count)
  21. {
  22.     return -EISDIR;
  23. }
  24.  
  25. static int minix_readdir(struct inode *, struct file *, struct dirent *, int);
  26.  
  27. static struct file_operations minix_dir_operations = {
  28.     NULL,            /* lseek - default */
  29.     minix_dir_read,        /* read */
  30.     NULL,            /* write - bad */
  31.     minix_readdir,        /* readdir */
  32.     NULL,            /* select - default */
  33.     NULL,            /* ioctl - default */
  34.     NULL,            /* mmap */
  35.     NULL,            /* no special open code */
  36.     NULL,            /* no special release code */
  37.     file_fsync        /* default fsync */
  38. };
  39.  
  40. /*
  41.  * directories can handle most operations...
  42.  */
  43. struct inode_operations minix_dir_inode_operations = {
  44.     &minix_dir_operations,    /* default directory file-ops */
  45.     minix_create,        /* create */
  46.     minix_lookup,        /* lookup */
  47.     minix_link,        /* link */
  48.     minix_unlink,        /* unlink */
  49.     minix_symlink,        /* symlink */
  50.     minix_mkdir,        /* mkdir */
  51.     minix_rmdir,        /* rmdir */
  52.     minix_mknod,        /* mknod */
  53.     minix_rename,        /* rename */
  54.     NULL,            /* readlink */
  55.     NULL,            /* follow_link */
  56.     NULL,            /* bmap */
  57.     minix_truncate,        /* truncate */
  58.     NULL            /* permission */
  59. };
  60.  
  61. static int minix_readdir(struct inode * inode, struct file * filp,
  62.     struct dirent * dirent, int count)
  63. {
  64.     unsigned int offset,i;
  65.     char c;
  66.     struct buffer_head * bh;
  67.     struct minix_dir_entry * de;
  68.     struct minix_sb_info * info;
  69.  
  70.     if (!inode || !inode->i_sb || !S_ISDIR(inode->i_mode))
  71.         return -EBADF;
  72.     info = &inode->i_sb->u.minix_sb;
  73.     if (filp->f_pos & (info->s_dirsize - 1))
  74.         return -EBADF;
  75.     while (filp->f_pos < inode->i_size) {
  76.         offset = filp->f_pos & 1023;
  77.         bh = minix_bread(inode,(filp->f_pos)>>BLOCK_SIZE_BITS,0);
  78.         if (!bh) {
  79.             filp->f_pos += 1024-offset;
  80.             continue;
  81.         }
  82.         while (offset < 1024 && filp->f_pos < inode->i_size) {
  83.             de = (struct minix_dir_entry *) (offset + bh->b_data);
  84.             offset += info->s_dirsize;
  85.             filp->f_pos += info->s_dirsize;
  86.             if (de->inode) {
  87.                 for (i = 0; i < info->s_namelen; i++)
  88.                     if ((c = de->name[i]) != 0)
  89.                         put_fs_byte(c,i+dirent->d_name);
  90.                     else
  91.                         break;
  92.                 if (i) {
  93.                     put_fs_long(de->inode,&dirent->d_ino);
  94.                     put_fs_byte(0,i+dirent->d_name);
  95.                     put_fs_word(i,&dirent->d_reclen);
  96.                     brelse(bh);
  97.                     return i;
  98.                 }
  99.             }
  100.         }
  101.         brelse(bh);
  102.     }
  103.     return 0;
  104. }
  105.